package com.changgou.pay.service.impl;

import com.alibaba.fastjson.JSON;
import com.changgou.pay.service.WeixinPayService;
import com.github.wxpay.sdk.WXPayUtil;
import entity.HttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class WeixinPayServiceImpl implements WeixinPayService {

    @Value("${weixin.appid}")    //微信公众账号或开放平台APP的唯一标识
    private String appid;

    @Value("${weixin.partner}")   //财付通平台的商户账号
    private String partner;

    @Value("${weixin.partnerkey}")   //财付通平台的商户密钥
    private String partnerkey;

    @Value("${weixin.notifyurl}")  //回调地址
    private String notifyurl;


    /**
     * 通过下单后生成二维码
     *
     * @param out_trade_no  :订单号
     * @param money         :金额
     * @return
     */

    @Override
    public Map<String, String> createNative(Map<String,String> parameter) {

        try {

            //1.用map来组装参数
            Map<String,String> param = new HashMap();

                //公众号id
            param.put("appid", appid);
                //商户号
            param.put("mch_id", partner);
                //随机字符串  :WXPayUtil.generateNonceStr():自带有获得随机字符串
            param.put("nonce_str", WXPayUtil.generateNonceStr());

                //商户描述 :相当于这个商品叫什么名字,直接写死
            param.put("body", "畅购");
                //商户订单号
            param.put("out_trade_no", parameter.get("out_trade_no"));
                //标价金额
            param.put("total_fee", parameter.get("total_fee"));


            //添加一个数据,自定义数据
                //转为json格式
            String s = JSON.toJSONString(parameter);  //parameter中有用户名,可以传进去

            param.put("attach", s);  //增加一个附件数据



                //终端ip
            param.put("spbill_create_ip", "127.0.0.1");
                //通知地址:相当于微信系统发送信息给畅购的地址
            param.put("notify_url", notifyurl);
                //交易类型
            param.put("trade_type", "NATIVE" );

            //签名:MAP转换为XML字符串（自动添加签名） TODO
            //2.将map转换变成xml(自动添加签名)
            // 参数:
            // 1.map类型,
            // 2.签名
            String paramXML = WXPayUtil.generateSignedXml(param, partnerkey);

            //3.调用httpclient的方法,模拟浏览器发送请求

                //相当于打开浏览器,输入一个要访问的地址
            HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
            httpClient.setHttps(true);  //设置为https请求
            httpClient.setXmlParam(paramXML); //设置请求体的参数(xml)
            httpClient.post();   //相当于按下回车键 :为post()请求

            //4.调用httpclient的方法,模拟浏览器接收响应
            String content = httpClient.getContent(); //用来获取响应结果
            System.out.println(content);

            //5.将xml转换成map格式
            Map<String, String> map = WXPayUtil.xmlToMap(content);

            //6.map中有支付二维码的连接数据
            //7.封装返回
            Map<String,String> resultMap = new HashMap<>();
            resultMap.put("code_url",map.get("code_url") );  //二维码地址
            resultMap.put("out_trade_no", parameter.get("out_trade_no"));     //订单号
            resultMap.put("total_fee", parameter.get("total_fee"));               //金额

            return resultMap;
        } catch (Exception e) {
            e.printStackTrace();
            return  new HashMap<>();
        }
    }

    @Override
    public Map<String, String> queryStatus(String out_trade_no) {
        try {

            //1.用map来组装参数
            Map<String,String> param = new HashMap();

            //公众号id
            param.put("appid", appid);
            //商户号
            param.put("mch_id", partner);
            //随机字符串  :WXPayUtil.generateNonceStr():自带有获得随机字符串
            param.put("nonce_str", WXPayUtil.generateNonceStr());

            //商户订单号
            param.put("out_trade_no", out_trade_no);


            //签名:MAP转换为XML字符串（自动添加签名） TODO
            //2.将map转换变成xml(自动添加签名)
            // 参数:
            // 1.map类型,
            // 2.签名
            String paramXML = WXPayUtil.generateSignedXml(param, partnerkey);

            //3.调用httpclient的方法,模拟浏览器发送请求

            //相当于打开浏览器,输入一个要访问的地址
            HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
            httpClient.setHttps(true);  //设置为https请求
            httpClient.setXmlParam(paramXML); //设置请求体的参数(xml)
            httpClient.post();   //相当于按下回车键 :为post()请求

            //4.调用httpclient的方法,模拟浏览器接收响应
            String content = httpClient.getContent(); //用来获取响应结果
            System.out.println(content);

            //5.将xml转换成map格式
            Map<String, String> map = WXPayUtil.xmlToMap(content);

            //6.map中有支付二维码的连接数据
            return map;
        } catch (Exception e) {
            e.printStackTrace();
            return  new HashMap<>();
        }
    }
}
